import { createRouter, createWebHashHistory } from 'vue-router'
import { useSystemStore } from '@/stores/index'
import staticRoutes from './routes'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'
import dict from '@/utils/dict'
import packageJson from '../../package.json'
import { isMobile } from '@/utils/index'

NProgress.configure({ showSpinner: false })

// 添加这行定义
const LOCALSTORAGEKEY = packageJson.name

export const routes = staticRoutes
const router = createRouter({
  history: createWebHashHistory(),
  routes: [
    ...routes,
    {
      path: '/login',
      name: 'login',
      component: () =>
        !isMobile() ? import('@/views/login.vue') : import('@/views/mobile/login/index.vue'),
      meta: { title: '登录 - XIN计划新服' }
    },
    {
      path: '/:pathMatch(.*)*',
      component: () => import('@/views/page-404.vue'),
      meta: { title: '404 - 页面未找到' }
    }
  ]
})

// 在 router 创建后，添加确定的路由
// const definedRoutes = [
//   {
//     path: '/trade',
//     name: 'trade',
//     component: () => import('@/views/trade/index.vue'),
//     meta: { name: '交易行', icon: 'Shop' }
//   },
//   {
//     path: '/admin-table',
//     name: 'admin-table',
//     component: () => import('@/views/admin-table/index.vue'),
//     meta: { name: '系统设置', icon: 'Setting', role: 'ROOT' }
//   }
// ];

// 查找根路由的实际名称
let rootRouteName = null
router.getRoutes().forEach((route) => {
  if (route.path === '/') {
    rootRouteName = route.name
  }
})

// 添加这些确定的路由
// definedRoutes.forEach(route => {
//   if (rootRouteName) {
//     // 如果找到了根路由的名称，使用该名称添加子路由
//     router.addRoute(rootRouteName, route);
//   } else {
//     // 如果根路由没有名称，添加为顶级路由
//     router.addRoute(route);
//   }
// });

// 路由映射
export const routeMap = new Map() // key<Symbol>:permission<array>
generateRouteMap()

function generateRouteMap() {
  router.getRoutes().map((route) => {
    route.meta = route.meta || {}
    route.meta.key = Symbol()
    routeMap.set(route.meta.key, route)
  })
}

// 获取完整路径
router.getFullPath = function (route) {
  let r = routeMap.get(route.meta?.key)
  if (r) {
    return r.path
  }
  return ''
}

// 设置默认标题
const DEFAULT_TITLE = 'XIN计划新服'

// 全局导航守卫
router.beforeEach(async (to, from) => {
  const systemStore = useSystemStore()
  NProgress.start()

  // 设置页面标题
  document.title =
    to.meta.title || (to.meta.name ? `${to.meta.name} - ${DEFAULT_TITLE}` : DEFAULT_TITLE)

  // 检查 localStorage 中的 token
  const token = localStorage.getItem('token')

  // 如果没有token但状态中仍为登录状态，执行登出
  if (!token && systemStore.isLogin) {
    systemStore.logout()
  }

  // 如果有 token 且目标是登录页，跳转到上一个页面或首页
  if (token && to.name === 'login') {
    systemStore.setToken(token) // 更新 store 中的 token
    // 如果是直接访问登录页，跳转到保存的路径或首页
    const savedPath = localStorage.getItem('lastPath') || '/'
    return { path: savedPath }
  }

  // 保存当前路径（排除登录页和404页）
  if (to.name !== 'login' && !to.path.includes('404')) {
    localStorage.setItem('lastPath', to.path)
  }

  // 修改这里的重定向方式 - 关键修复
  if (!systemStore.isLogin && to.name !== 'login' && dict.SETTING.OPEN_PERMISSION) {
    // 使用path方式而不是name方式重定向，并使用replace而不是push
    return { path: '/login', replace: true, query: { redirect: to.fullPath } }
  }

  // 如果已登录但没有权限，尝试从 localStorage 恢复权限
  if (systemStore.isLogin && (!systemStore.permissions || systemStore.permissions.length === 0)) {
    const savedState = JSON.parse(localStorage.getItem(LOCALSTORAGEKEY) || '{}')
    if (savedState.permissions) {
      systemStore.setPermissions(savedState.permissions)
    }
  }

  // 重新生成路由的判断逻辑改为
  if (systemStore.isLogin && (systemStore.routes.length === 0 || !systemStore.utype)) {
    try {
      // 强制从 localStorage 恢复 utype
      const savedState = JSON.parse(localStorage.getItem(LOCALSTORAGEKEY) || '{}')
      if (savedState.utype && !systemStore.utype) {
        systemStore.setUtype(savedState.utype)
      }

      // 重新生成路由
      await systemStore.generateRoutes()

      // 如果目标路由没有匹配项，可能是因为路由刚刚重新生成
      if (to.matched.length === 0) {
        return { path: to.fullPath, replace: true }
      }
    } catch (error) {
      console.error('路由生成失败:', error)
    }
  }

  // 如果没有匹配到路由，打印错误
  if (to.matched.length === 0) {
    console.error('没有匹配到路由:', to.path)
  }
})

router.afterEach(() => {
  NProgress.done()
})

// 添加路由错误处理
router.onError((error) => {
  console.error('路由错误:', error)
  // 如果是组件加载失败，记录但不自动跳转
  if (error.type === 'chunk loading' || error.message.includes('Failed to fetch')) {
    console.error('组件加载失败')
  }
})

// 在应用启动时检查并修正URL
if (window.location.pathname.includes('/login')) {
  const hash = window.location.hash
  const search = window.location.search
  // 强制重置URL路径
  window.history.replaceState(null, '', '/' + hash + search)
}

// 添加到router对象中
router.beforeResolve((to, from) => {
  // 每次路由解析完成后检查URL
  if (window.location.pathname.includes('/login')) {
    // 获取当前hash和search
    const hash = window.location.hash
    const search = window.location.search
    // 强制修正URL
    window.history.replaceState(null, '', '/' + hash + search)
  }
})

export default router
